package com.itheima.reggie.common;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.sql.SQLIntegrityConstraintViolationException;

/**
 * 全局异常处理器
 * 如果我们想在项目中定义一个全局异常处理器
 * 那么我们就需要创建一个普通类 在这个类上加上@ControllerAdvice注解
 * 加上这个注解后 可以通过他的annotations属性 设置拦截哪一类的Controller里面的异常方法
 * annotations = {RestController.class} 这个配置就表示 只要加了RestController注解的类
 * 里面出现了异常 都会被这个全局异常处理器拦截到
 *
 */

@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody //把返回的数据类型转换成JSON数据格式
@Slf4j
public class GlobalExceptionHandler {
    /**
     * 异常处理方法
     * 在异常处理方法上加上@ExceptionHandler()注解 表示指定你要拦截处理的是哪一类异常
     * @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
     * 表示只要是这个异常 都会进入到这个异常处理器方法中
     */
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){
        //日志打印错误信息
        log.error(ex.getMessage());
        if (ex.getMessage().contains("Duplicate entry")){
            String[] s = ex.getMessage().split(" ");
            String msg = "用户名"+s[2]+"已存在";
            return R.error(msg);
        }
        return R.error("未知错误 请联系管理员 联系方式：157 6671 7761");
    }

    /**
     * 捕获自定义异常
     * @param ex
     * @return
     */
    @ExceptionHandler(CustomException.class)
    public R<String> exceptionHandler(CustomException ex){
        //日志打印错误信息
        log.error(ex.getMessage());
        return R.error(ex.getMessage());
    }
}
